﻿#include "stdafx.h"
#include <string>
#include <cstring>
#include "IHashable.h"

namespace hash_map{
	template<class T>
	AHashable<T>::AHashable(T x)
		:self(x){}

	template<class T>
	int AHashable<T>::getHashCode(){
		throw "unimplemented";
	}
	
	template<class T>
	bool AHashable<T>::operator==(const IHashable& b){
		const AHashable<T>* r=reinterpret_cast<const AHashable<T>*>(&b);
		return self==r->self;	
	}	

	
	static int hashCode(const char*xx){
		int res=0;
		const int mod=111121;
		const int il=257;
		for(;*xx;++xx)
			res=(res*il+*xx)%mod;
		return res;
	}

	int AHashable<int>::getHashCode(){
		return self;
	}

	int AHashable<double>::getHashCode(){
		int* p = reinterpret_cast<int*>(&self);
		return abs(*p^*(p+1));
	}

	bool AHashable<const char*>::operator==(const IHashable& b){
		const AHashable<const char*>* r=reinterpret_cast<const AHashable<const char*>*>(&b);
		return !strcmp(self,r->self);
	}

	int AHashable<char*>::getHashCode(){
		return hashCode(self);
	}

	int AHashable<std::string>::getHashCode(){
		return hashCode(self.c_str());
	}
}